#ifndef __MY_CONFIG_HPP__
#define __MY_CONFIG_HPP__

#include <iostream>
#include <mutex>
#include "util.hpp"

namespace cloud
{
/*配置信息加载类*/
#define CONFIG_PATH "./cloud.conf"
    class Config
    {
    public:
        Config() { ReadConfigFile(); }

        /*获取单例对象*/
        static Config *GetInstance()
        {
            if (_cfg == nullptr)
            {
                std::unique_lock<std::mutex> lock(_mtx);
                if (_cfg == nullptr)
                {
                    _cfg = new Config();
                }
            }

            return _cfg;
        }

        /*返回热点判断时间*/
        int GetHotTime() { return _hot_time; }

        /*返回服务器port*/
        uint16_t GetServerPort() { return _server_port; }

        /*返回服务器ip*/
        std::string GetServerIp() { return _server_ip; }

        /*返回文件下载前缀路径*/
        std::string GetDownloadPrefix() { return _download_prefix; }

        /*返回压缩包后缀名称*/
        std::string GetPackFileSuffix() { return _packfile_suffix; }

        /*返回压缩文件存放路径*/
        std::string GetPackDir() { return _pack_dir; }

        /*返回上传文件存放路径*/
        std::string GetBackDir() { return _back_dir; }

        /*返回服务端备份信息存放文件*/
        std::string GetBackupFile() { return _backup_file; }

    private:
        static std::mutex _mtx;
        static Config *_cfg;

    private:
        int _hot_time;                // 热点判断时间
        uint16_t _server_port;        // 服务器port
        std::string _server_ip;       // 服务器IP
        std::string _download_prefix; // 文件下载前缀路径
        std::string _packfile_suffix; // 压缩包后缀名称
        std::string _pack_dir;        // 压缩文件存放路径
        std::string _back_dir;        // 上传文件存放路径
        std::string _backup_file;     // 服务端备份信息存放文件

        /*从指定配置文件中加载配置信息*/
        bool ReadConfigFile()
        {
            FileUtil fu(CONFIG_PATH);
            std::string body;
            if (fu.GetContent(&body) == false)
            {
                printf("read config file,get content failed\n");
                return false;
            }

            Json::Value root;
            if (JsonUtil::UnSerialize(body, &root) == false)
            {
                printf("read config file,unserialize failed\n");
                return false;
            }

            _hot_time = root["hot_time"].asInt();
            _server_port = root["server_port"].asInt();
            _server_ip = root["server_ip"].asString();
            _download_prefix = root["download_prefix"].asString();
            _packfile_suffix = root["packfile_suffix"].asString();
            _pack_dir = root["pack_dir"].asString();
            _back_dir = root["back_dir"].asString();
            _backup_file = root["backup_file"].asString();

            return true;
        }
    };

    std::mutex Config::_mtx;
    Config *Config::_cfg = nullptr;
}

#endif